<?php

namespace app\admin\controller\yxerp\product;

use Throwable;
use app\common\controller\Backend;

/**
 * 商品SKU管理
 */
class Sku extends Backend
{
    /**
     * Sku模型对象
     * @var object
     * @phpstan-var \app\admin\model\yxerp\product\Sku
     */
    protected object $model;

    protected array|string $preExcludeFields = ['id', 'create_time', 'update_time'];

    protected array $withJoinTable = ['product'];

    protected string|array $quickSearchField = ['id'];

    public function initialize(): void
    {
        parent::initialize();
        $this->model = new \app\admin\model\yxerp\product\Sku();
    }

    /**
     * 查看
     * @throws Throwable
     */
    public function index(): void
    {
        // 如果是 select 则转发到 select 方法，若未重写该方法，其实还是继续执行 index
        if ($this->request->param('select')) {
            $this->select();
        }

        /**
         * 1. withJoin 不可使用 alias 方法设置表别名，别名将自动使用关联模型名称（小写下划线命名规则）
         * 2. 以下的别名设置了主表别名，同时便于拼接查询参数等
         * 3. paginate 数据集可使用链式操作 each(function($item, $key) {}) 遍历处理
         */
        list($where, $alias, $limit, $order) = $this->queryBuilder();
        $res = $this->model
            ->withJoin($this->withJoinTable, $this->withJoinType)
            ->alias($alias)
            ->where($where)
            ->order($order)
            ->paginate($limit);
        $res->visible(['product' => ['name']]);

        $this->success('', [
            'list'   => $res->items(),
            'total'  => $res->total(),
            'remark' => get_route_remark(),
        ]);
    }

    /**
     * 批量添加SKU
     * @throws Throwable
     */
    public function batchAdd(): void
    {
        if ($this->request->isPost()) {
            $data = $this->request->post();
            if (!isset($data['skus']) || !is_array($data['skus'])) {
                $this->error(__('Parameter %s can not be empty', ['skus']));
            }

            $productId = isset($data['product_id']) ? (int)$data['product_id'] : 0;
            if (!$productId) {
                $this->error(__('Parameter %s can not be empty', ['product_id']));
            }

            $skus = $data['skus'];
            $result = [];
            
            foreach ($skus as $sku) {
                $sku['product_id'] = $productId;
                
                // 验证SKU数据
                $validate = validate(\app\admin\validate\yxerp\product\Sku::class);
                if (!$validate->check($sku)) {
                    $this->error($validate->getError());
                }
                
                // 创建SKU
                try {
                    $this->model->startTrans();
                    $newSku = $this->model->create($sku);
                    $this->model->commit();
                    $result[] = $newSku;
                } catch (Throwable $e) {
                    $this->model->rollback();
                    $this->error($e->getMessage());
                }
            }

            $this->success(__('Added successfully'), ['skus' => $result]);
        }
        $this->error(__('Parameter error'));
    }

    /**
     * 若需重写查看、编辑、删除等方法，请复制 @see \app\admin\library\traits\Backend 中对应的方法至此进行重写
     */
}